var inputFun =  function(){
    let inputData = storages.create("input_data");
    let q = {};

    // 存储的 key,value
    q.setSave = function(name,value){
        inputData.put(name,value);
    }

    // 获取的key 返回value
    q.getSave = function(name){
        let value = inputData.get(name);
        return value;
    }

    return q;
}()

var graphColor = function(){
    let q = {};

    /**
     * 所有点都对应颜色，才返回true
     * @param {*} img  页面截图
     * @param {Array} data 需要比色的数组元素 [[x,y,color],[x1,y1,color1]]
     */
    q.多点比色 = function(data){
        let img = captureScreen();
         data.forEach(v => {            
             let x = v[0];
             let y = v[1];
             let col = v[2];
       
             let por = images.detectsColor(img,col, x, y);
             
             if(!por){
                 return false;
             }
         });
     
         return {x:data[0][0],y:data[0][1]};
     },

     /**
      * 所有点都不对应颜色，才返回true
     * @param {*} img  页面截图
     * @param {Array} data 需要不匹配颜色的数组元素 [[x,y,color],[x1,y1,color1]]
     */
    q.多点差色 = function(data){
        let img = captureScreen();
        data.forEach(v => {            
            let x = v[0];
            let y = v[1];
            let col = v[2];
      
            let por = images.detectsColor(img,col, x, y);
            
            if(por){
                return false;
            }
        });
    
        return true;
    },

     /**
      * 相对位置找色
      * @param {*} img 页面截图
      * @param {Array} data 需要找色的数组元素 [color,[[x,y,color],[x1,y1,color1]]]
      */
     q.多点找色 = function(data){
        let img = captureScreen();
        let firstColor = data[0];
        let colors = data[1];
        let pot = images.findMultiColors(img,firstColor,colors)
        if(pot){
            pot.x = Math.floor(pot.x);
            pot.y = Math.floor(pot.y);
        }
        return pot?pot:false;
    } ,

    /**
     * 一个比色函数  包含匹配 和 不匹配
     * 检测透明按钮的方法
     * @param {*} img  页面截图
     * @param {*Array} data  一个3唯数组[
     * [[x,y,color],[x1,y1,color1],[x2,y2,color2]],
     * [[x3,y3,color3],[x4,y4,color4],[x5,y6,color6]]
     * ]
     * 其中data[0] 中放的是需要匹配的点素组，
     * data[1]放的是必定不匹配的点
     * 只有满足两个条件才会返回true
     * 
     */
    q.多组比色 =  function (data){
        let arr1 = data[0];
        let arr2 = data[1];
        
        let falg1 = q.多点比色(arr1);
        let falg2 = q.多点差色(arr2);

        if(falg1 && falg2) return true;

        return false;

    },

    /**
     * 专门用来转换触动取色工具取的多点比色格式为auto用的函数
     * 例如 "-10|-9|0xffede4,11|-10|0xfff2df,0|-32|0xf7645c,0|31|0xf0635a,-31|3|0xf76558,30|1|0xf06d63"
     * 
     * @param {*String} str 
     */
    q.触动多点找色转数组 = function (str){
        let ar1 = str.split(",");
        let arr2 = [];
        ar1.forEach((v,k) => {
            let narr = v.split("|");
            narr[0] = parseInt(narr[0]);
            narr[1] = parseInt(narr[1]);
            narr[2] = colors.toString(parseInt(narr[2]));
            arr2[k] = narr;  
        })
       
        return arr2;
    },
    
    /**
     * 专门用来转换触动取色工具取的多点比色格式为auto的多点比色函数
     * 例如: [0xfbf1e7, "-10|-9|0xffede4,11|-10|0xfff2df,0|-32|0xf7645c,0|31|0xf0635a,-31|3|0xf76558,30|1|0xf06d63", 90, 0, 0, 1080, 2160, { orient : 2 }]
     * @param {*} img 页面截图
     * @param {Array} data 
     */
    q.触动多点找色 = function (data){
        let img = captureScreen();
        let firstColor = data[0];
        let colors = q.触动多点找色转数组(data[1]);
       
        let w = data[5]-data[3];
        let h = data[6]-data[4];
        let pot = images.findMultiColors(img,firstColor,colors,{
            threshold: 15,
            region: [data[3],data[4],w,h]
        });
        
        if(pot){
            pot.x = Math.floor(pot.x);
            pot.y = Math.floor(pot.y);
        }
        return pot?pot:false;
    }

    return q;
}()




var forecast = function(){
    let q = {};

    /**
     * 该函数是为了减少脚本的失误率而写
     * 填写当前页面的 和 期望页面的 识别来确定现在用什么操作
     * 
     * @param {*} 操作方法 
     * @param {*} 操作数据 
     * @param {*} 成功回调 
     * @param {*} 重复执行次数 
     * @param {*} 下一页面操作方法 
     * @param {*} 下一页面操作数据 
     * @param {*} 失败回调 
     * @param {*} 打印内容 
     */
    q.预操作 =  function (操作方法,操作数据,成功回调,重复执行次数,
        下一页面操作方法,下一页面操作数据,失败回调,打印内容){
        q.show(打印内容);
        let flag;
        let index = 重复执行次数;
        while (index != 0) { 
           
            sleep(1000);
            //  检测当前页面并执行操作
            if (操作方法.call(null,操作数据)) {
                q.show("检测到操作页面");
                let [x,y] = 操作方法(操作数据);
                if (成功回调) {
                    成功回调(x,y);
                }  
            }
            else if (下一页面操作方法.call(null,下一页面操作数据))   {
                show("检测到跳转到预定页面");
                flag = true;
                break;
            } 
            else {
                 index = index - 1 ; 
                 q.show("未知页面，等待加载5秒继续检测");
                 sleep(5000)
                }
            
            }

            if(index == 0){
                flag = false;
                失败回调();
            }

            return flag;
        
        
    }  

    q.show = function(str){
        // 打印
        log(str);
        // 写到日志
        // 显示到悬浮窗
    }
    
    return q;
}()


// 常用的一些方法
var selfControlEngine =  function(){
    let q = {};

    // 本地存储
    q.save = inputFun;
    
    // 图色函数
    q.graphColor = graphColor;

    // 高级函数
    q.forecast = forecast;

    return q;
}()

module.exports = selfControlEngine;